home *** CD-ROM | disk | FTP | other *** search
/ VIPER Paradice / VIPER.ISO / pc / SETUP.EXE / SETUP.DXR / 00041_Push Button.ls < prev    next >
Encoding:
Text File  |  2002-06-30  |  12.4 KB  |  299 lines

  1. property spriteNum, mySprite, myMember, myStandardMember, myRollovermember, myMouseDownMember, myDisabledMember, myMouseDownSound, myMouseUpSound, myActiveFlag, myXRayFlag, myMessageType, myMessage, theMouseWasUp, myMouseDown, myRollover, mySubscribersList
  2.  
  3. on getBehaviorDescription me
  4.   return "PUSH BUTTON" & RETURN & RETURN & "This behavior sets the member of a sprite depending on the state of the mouse (elsewhere, rollover, mouseDown, mouseUp)." & RETURN & RETURN & "This creates a button which can either initiate actions in other sprites, or provide visual feedback for other behaviors attached to the same sprite." & RETURN & RETURN & "The behavior can be enabled or disabled, using a #PushButton_ToggleActive call to the behavior or the sprite." & RETURN & RETURN & "Two messaging systems are provided:" & RETURN & "1) A custom message can sent whenever the Push Button behavior is activated. " & "This message can be sent to a Movie Script handler, all sprites, or the actorList. " & "The message can also be suppressed." & RETURN & RETURN & "2) Objects can 'subscribe' to the behavior in order to receive PushButton_Activated, _Enabled and _Disabled messages. " & "A two-way messaging system allows for cleaning up object references before an object is destroyed." & RETURN & RETURN & "The behavior can be set to consider that all sprites in higher channels either block or let through all mouse events. " & "If mouse events are allowed to pass, you can place blended sprites above the button to change its color. " & "If mouse events are blocked, such translucent sprites provide an alternative method for disabling the button." & RETURN & RETURN & "PERMITTED MEMBER TYPES" & RETURN & "[#bitmap, #filmLoop, #flash, #movie, #picture, #quickTimeMedia, #shape, #vectorShape]" & RETURN & RETURN & "PARAMETERS:" & RETURN & "* Standard member (when mouse is elsewhere)" & RETURN & "* Rollover member" & RETURN & "* MouseDown member" & RETURN & "* Disabled member" & RETURN & RETURN & "Optional parameters:" & RETURN & "* MouseDown sound" & RETURN & "* MouseUp sound" & RETURN & "If members are placed consecutively in the cast in this order then default values can be used to create the button." & RETURN & RETURN & "* Do sprites above the button allow mouse events through?" & RETURN & "* Type of message sent on mouseUp: do | sendAllSprites | call the actorList | no action" & RETURN & "* Custom Message sent on mouseUp" & RETURN & RETURN & "NOTES:" & RETURN & "If you use 'do', be sure that you have a handler in a Movie Script that corresponds to the message sent." & RETURN & RETURN & "If you indicate 'no action' then this behavior will simply deal with the different states of the button. " & "You can still execute an action on mouseUp by one of two means:" & RETURN & "1) Add a behavior with a mouseUp handler to the same sprite (for example, the 'Jump Back Button' behavior" & RETURN & "2) Subscribe an object to the current behavior. " & " The object will then receive your Custom Message directly."
  5. end
  6.  
  7. on getBehaviorTooltip me
  8.   return "Use with graphic members." & RETURN & RETURN & "Swaps the member of the sprite according to the state of the mouse. " & "You can use this dynamic button behavior to play a brief sound on mouseDown and/or mouseUp, send out a custom message of your choice, and trigger actions of other sprites. " & "You can also use it to provide visual feedback for other behaviors on the same sprite (for example, Jump to Marker Button). " & "This behavior can also interact with custom objects."
  9. end
  10.  
  11. on beginSprite me
  12.   initialize(me)
  13. end
  14.  
  15. on exitFrame me
  16.   if myActiveFlag then
  17.     CheckForRollover(me)
  18.   end if
  19. end
  20.  
  21. on endSprite me
  22.   call(#PushButton_ClosingDown, mySubscribersList, me, spriteNum, myMessage)
  23. end
  24.  
  25. on initialize me
  26.   mySprite = sprite(me.spriteNum)
  27.   myMember = mySprite.member
  28.   repeat while the last char in myMessage = SPACE
  29.     delete char -30000 of myMessage
  30.   end repeat
  31.   if not ["do", "no action"].getPos(myMessageType) then
  32.     if myMessage contains SPACE then
  33.       ErrorAlert(me, #spaceInMessage, myMessage)
  34.     else
  35.       myMessage = symbol(myMessage)
  36.     end if
  37.   end if
  38.   myActiveFlag = myActiveFlag = "Active"
  39.   myXRayFlag = myXRayFlag = "let all mouse events through"
  40.   myStandardMember = value(myStandardMember)
  41.   myRollovermember = value(myRollovermember)
  42.   myMouseDownMember = value(myMouseDownMember)
  43.   myDisabledMember = value(myDisabledMember)
  44.   myMouseDownSound = value(myMouseDownSound)
  45.   myMouseUpSound = value(myMouseUpSound)
  46.   if myActiveFlag then
  47.     myMember = myStandardMember
  48.     mySprite.member = myMember
  49.   else
  50.     myMember = myDisabledMember
  51.     mySprite.member = myMember
  52.   end if
  53.   mySubscribersList = []
  54.   sendAllSprites(#PushButton_OpenForBusiness, mySubscribersList, me, spriteNum, myMessage)
  55. end
  56.  
  57. on CheckForRollover me
  58.   mouseOverMe = rollover(spriteNum)
  59.   if mouseOverMe then
  60.     if not myXRayFlag then
  61.       mouseOverMe = the mouseMember = myMember
  62.     end if
  63.   end if
  64.   if myRollover = mouseOverMe then
  65.     if theMouseWasUp = the mouseUp then
  66.       exit
  67.     else
  68.       theMouseWasUp = the mouseUp
  69.       if mouseOverMe then
  70.         if the mouseUp then
  71.           if myMouseDown then
  72.             activate(me)
  73.           else
  74.             myMember = myRollovermember
  75.             mySprite.member = myMember
  76.           end if
  77.         else
  78.           clickOn(me)
  79.         end if
  80.       else
  81.         if the mouseUp then
  82.           if myMouseDown then
  83.             Disactivate(me)
  84.           end if
  85.         end if
  86.       end if
  87.     end if
  88.   else
  89.     myRollover = mouseOverMe
  90.     if myMouseDown then
  91.       if myRollover then
  92.         myMember = myMouseDownMember
  93.         mySprite.member = myMember
  94.       else
  95.         myMember = myStandardMember
  96.         mySprite.member = myMember
  97.       end if
  98.     else
  99.       if not (the mouseDown) and myRollover then
  100.         myMember = myRollovermember
  101.         mySprite.member = myMember
  102.       else
  103.         myMember = myStandardMember
  104.         mySprite.member = myMember
  105.       end if
  106.     end if
  107.   end if
  108. end
  109.  
  110. on clickOn me
  111.   myMouseDown = 1
  112.   myMember = myMouseDownMember
  113.   mySprite.member = myMember
  114.   if not voidp(myMouseDownSound) and (myMouseDownSound <> #none) then
  115.     puppetSound(myMouseDownSound)
  116.   end if
  117.   updateStage()
  118. end
  119.  
  120. on activate me
  121.   myMouseDown = 0
  122.   theMouseWasUp = 0
  123.   myMember = myStandardMember
  124.   mySprite.member = myMember
  125.   if not voidp(myMouseUpSound) and (myMouseUpSound <> #none) then
  126.     puppetSound(myMouseUpSound)
  127.   end if
  128.   updateStage()
  129.   case myMessageType of
  130.     "do":
  131.       do(myMessage)
  132.     "sendAllSprites":
  133.       sendAllSprites(myMessage, me, spriteNum)
  134.     "call the actorList":
  135.       call(myMessage, the actorList, me, spriteNum)
  136.   end case
  137.   call(#PushButton_Activated, mySubscribersList, me, spriteNum, myMessage)
  138. end
  139.  
  140. on Disactivate me
  141.   myMouseDown = 0
  142.   myMember = myStandardMember
  143.   mySprite.member = myMember
  144. end
  145.  
  146. on PushButton_ToggleActive me, trueOrFalse
  147.   if voidp(trueOrFalse) then
  148.     myActiveFlag = not myActiveFlag
  149.   else
  150.     case ilk(trueOrFalse) of
  151.       #integer:
  152.         myActiveFlag = trueOrFalse <> 0
  153.       otherwise:
  154.         return #invalidTypeError
  155.     end case
  156.   end if
  157.   if myActiveFlag then
  158.     myMember = myStandardMember
  159.     mySprite.member = myMember
  160.     call(#PushButton_Enabled, mySubscribersList, me, spriteNum, myMessage)
  161.   else
  162.     myMember = myDisabledMember
  163.     mySprite.member = myMember
  164.     call(#PushButton_Disabled, mySubscribersList, me, spriteNum, myMessage)
  165.   end if
  166. end
  167.  
  168. on PushButton_GetReference me, theList
  169.   case ilk(theList) of
  170.     #list:
  171.       theList.append(me)
  172.     #propList:
  173.       theList.addProp(me.spriteNum, me)
  174.     otherwise:
  175.       return me
  176.   end case
  177.   return theList
  178. end
  179.  
  180. on PushButton_Subscribe me, callingBehavior, theMessage
  181.   if not voidp(theMessage) then
  182.     if theMessage <> myMessage then
  183.       exit
  184.     end if
  185.   end if
  186.   if mySubscribersList.getPos(callingBehavior) then
  187.     exit
  188.   else
  189.     if objectp(callingBehavior) then
  190.       mySubscribersList.append(callingBehavior)
  191.       return me
  192.     end if
  193.   end if
  194. end
  195.  
  196. on PushButton_Unsubscribe me, callingBehavior
  197.   mySubscribersList.deleteOne(callingBehavior)
  198. end
  199.  
  200. on substituteStrings me, parentString, childStringList
  201.   i = childStringList.count()
  202.   repeat while i
  203.     tempString = EMPTY
  204.     dummyString = childStringList.getPropAt(i)
  205.     replacement = childStringList[i]
  206.     lengthAdjust = dummyString.char.count - 1
  207.     repeat while 1
  208.       position = offset(dummyString, parentString)
  209.       if not position then
  210.         parentString = tempString & parentString
  211.         exit repeat
  212.         next repeat
  213.       end if
  214.       if position <> 1 then
  215.         tempString = tempString & parentString.char[1..position - 1]
  216.       end if
  217.       tempString = tempString & replacement
  218.       delete me.char[1..position + lengthAdjust]
  219.     end repeat
  220.     i = i - 1
  221.   end repeat
  222.   return parentString
  223. end
  224.  
  225. on ErrorAlert me, theError, data
  226.   case theError of
  227.     #spaceInMessage:
  228.       if the runMode = "Author" then
  229.         behaviorName = string(me)
  230.         delete word 1 of behaviorName
  231.         delete char -30001 of behaviorName
  232.         delete char -30001 of behaviorName
  233.         terror1 = "BEHAVIOR ERROR: Frame ^0, Sprite ^1"
  234.         terror1 = substituteStrings(me, terror1, ["^0": the frame, "^1": the currentSpriteNum])
  235.         terror2 = "Behavior ^0"
  236.         terror2 = substituteStrings(me, terror2, ["^0": behaviorName])
  237.         terror3 = "This message includes spaces: ^0"
  238.         terror3 = substituteStrings(me, terror3, ["^0": QUOTE & data & QUOTE])
  239.         terror4 = "Only the first word will be used in sendAllSprite calls."
  240.         alert(terror1 & RETURN & RETURN & terror2 & RETURN & RETURN & terror3 & RETURN & RETURN & terror4)
  241.       end if
  242.   end case
  243. end
  244.  
  245. on isOKToAttach me, aSpriteType, aSpriteNum
  246.   tisok = 0
  247.   if aSpriteType = #graphic then
  248.     if PermittedMemberTypes().getOne(sprite(aSpriteNum).member.type) > 0 then
  249.       tisok = 1
  250.     end if
  251.   end if
  252.   return tisok
  253. end
  254.  
  255. on getPropertyDescriptionList me
  256.   theMember = sprite(the currentSpriteNum).member
  257.   memberType = theMember.type
  258.   permittedTypes = PermittedMemberTypes(me)
  259.   theMemberNum = theMember.number
  260.   suitableMembersList = GetSuitableMembers(me, permittedTypes)
  261.   descriptionList = [#myStandardMember: [#comment: "- GRAPHICS - Standard member for sprite", #format: #member, #range: suitableMembersList, #default: theMember], #myRollovermember: [#comment: "Rollover member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum + 1)], #myMouseDownMember: [#comment: "MouseDown member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum + 2)], #myDisabledMember: [#comment: "Disabled member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum + 3)]]
  262.   soundsAvailable = GetSuitableMembers(me, [#sound])
  263.   if soundsAvailable.count() then
  264.     soundsAvailable.addAt(1, #none)
  265.     descriptionList.addProp(#myMouseDownSound, [#comment: "- SOUNDS - Sound to play on mouseDown", #format: #sound, #range: soundsAvailable, #default: member(theMemberNum + 4)])
  266.     descriptionList.addProp(#myMouseUpSound, [#comment: "Sound to play on mouseUp", #format: #sound, #range: soundsAvailable, #default: member(theMemberNum + 5)])
  267.   end if
  268.   descriptionList.addProp(#myActiveFlag, [#comment: "- INTERACTION - Button is initially", #format: #string, #range: ["Active", "Inactive"], #default: "Active"])
  269.   descriptionList.addProp(#myXRayFlag, [#comment: "Sprites which cover the button", #format: #string, #range: ["block all mouse events", "let all mouse events through"], #default: 0])
  270.   descriptionList.addProp(#myMessageType, [#comment: "Action on mouseUp", #format: #string, #range: ["do", "sendAllSprites", "call the actorList", "no action"], #default: "sendAllSprites"])
  271.   descriptionList.addProp(#myMessage, [#comment: EMPTY, #format: #string, #default: "YourCustomMessage"])
  272.   return descriptionList
  273. end
  274.  
  275. on GetSuitableMembers me, permittedTypes
  276.   cursor(4)
  277.   suitableMembersList = []
  278.   maxCastLib = the number of castLibs
  279.   repeat with theCastLib = 1 to maxCastLib
  280.     maxMember = the number of castMembers of castLib theCastLib
  281.     repeat with memberNumber = 1 to maxMember
  282.       theMember = member(memberNumber, theCastLib)
  283.       if permittedTypes.getPos(theMember.type) then
  284.         if theMember.name = EMPTY then
  285.           suitableMembersList.append(theMember)
  286.           next repeat
  287.         end if
  288.         suitableMembersList.append(theMember.name)
  289.       end if
  290.     end repeat
  291.   end repeat
  292.   cursor(-1)
  293.   return suitableMembersList
  294. end
  295.  
  296. on PermittedMemberTypes me
  297.   return [#bitmap, #filmLoop, #flash, #movie, #picture, #quickTimeMedia, #shape, #vectorShape]
  298. end
  299.